<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // const 定义常量 
        // 变量 ： 有可能会改变的值
        // let a = 10;
        // a = 20;
        // 常量 ： 永远不变的值
        // Math.PI

        // const a = 10; // 声明一个常量 
        // console.log(a);

        // 常量的特点 ：
        // 1.一旦被声明 ，就不能被更改 
        // const a = 10;
        // a = 20;  // 不能被更改 
        // console.log(a);

        // 2. 不会挂载在window对象上 
        // const a = 10;
        // console.log(window.a);

        // 3.没有预解析 ，存在暂时性死区
        // console.log(a);
        // const a = 10;

        // 4. 支持块级作用域 
        // {
        //     const a = 10;
        //     console.log(a);
        // }
        // // console.log(a);
        // {

        //     const a = 20;
        //     console.log(a);
        // }


        // const 定义对象 
        // const obj = {
        //     myname:"张三",
        //     age:20
        // }
        // // 不能更改对象
        // // obj = {myname:"李四"};

        // // 修改某个属性是可以被更改的
        // obj.myname = "李四";
        // console.log(obj);

        
        // 复杂数据类型 都不能被更改 
        const obj = {
            myname:"张安",
            age:20,
            obj1:{
                hello:"你好"
            }
        }
        // Object.freeze(obj)  ; // 把对象冻结起来 ,只能冻结一层；多层 需要深冻结
        function deepFreeze(obj){
            Object.freeze(obj);
            for(let key in obj){
                if(obj.hasOwnProperty(key)){
                    if(typeof obj[key]==="object"){
                        deepFreeze(obj[key]);
                    }
                }
            }
        }

        deepFreeze(obj);
        // obj.myname = "李四";
        obj.obj1.hello = "修改了";
        console.log(obj);

    </script>
</body>

</html>